package com.jiangxjsy.core.redis;

import org.springframework.data.redis.connection.DataType;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * wukong-crm-master
 * 蒋胜宇
 * 2025/6/2 10:06
 */

public interface Redis {
    /**
     * 根据多个 key 删除 Redis 中的缓存
     *
     * @param keys keys，允许多个
     */
    void delete(Object... keys);

    /**
     * 根据多个 key 删除 Redis 中的缓存
     *
     * @param keys keys，允许多个
     */
    void delete(String... keys);

    /**
     * 获取 key 的剩余时间，其类似于命令 ttl key
     *
     * @param key key
     * @return 剩余时间，单位：秒
     */
    Long ttl(Object key);

    /**
     * 获取 key 的剩余时间，其类似于命令 ttl key
     *
     * @param key key
     * @return 剩余时间，单位：秒
     */
    Long ttl(String key);

    /**
     * 设置 key 的过期时间
     *
     * @param key key
     * @param timeout 过期时间，单位：秒
     */
    void expire(Object key, Integer timeout);

    /**
     * 设置 key 的过期时间
     *
     * @param key key
     * @param timeout 过期时间，单位：秒
     */
    void expire(String key, Integer timeout);

    /**
     * 设置 key 的过期时间
     *
     * @param key key
     * @param timeout 过期时间
     * @param timeUnit 时间单位
     */
    void expire(Object key, Integer timeout, TimeUnit timeUnit);

    /**
     * 设置 key 的过期时间
     *
     * @param key key
     * @param timeout 过期时间
     * @param timeUnit 时间单位
     */
    void expire(String key, Integer timeout, TimeUnit timeUnit);

    /**
     * 移除 key 的过期时间
     *
     * @param key key
     */
    void persist(Object key);

    /**
     * 移除 key 的过期时间
     *
     * @param key key
     */
    void persist(String key);

    /**
     * 判断 key 是否存在
     *
     * @param key key
     * @return 存在与否
     */
    Boolean hasKey(Object key);

    /**
     * 判断 key 是否存在
     *
     * @param key key
     * @return 存在与否
     */
    Boolean hasKey(String key);

    /**
     * 获取 key 所储存的值的类型
     *
     * @param key key
     * @return 类型
     */
    DataType type(Object key);

    /**
     * 获取 key 所储存的值的类型
     *
     * @param key key
     * @return 类型
     */
    DataType type(String key);

    /**
     * 设置 key 的值
     *
     * @param key key
     * @param value value
     */
    void set(Object key, Object value);

    /**
     * 设置 key 的值
     *
     * @param key key
     * @param value value
     */
    void set(String key, Object value);

    /**
     * 设置 key 的值，并设置过期时间
     *
     * @param key key
     * @param value value
     * @param timeout 过期时间，单位：秒
     */
    void setEx(Object key, Object value, Integer timeout);

    /**
     * 设置 key 的值，并设置过期时间
     *
     * @param key key
     * @param value value
     * @param timeout 过期时间，单位：秒
     */
    void setEx(String key, Object value, Integer timeout);

    /**
     * 设置 key 的值，并设置过期时间
     *
     * @param key key
     * @param value value
     * @param timeout 过期时间
     * @param timeUnit 时间单位
     */
    void setEx(Object key, Object value, Integer timeout, TimeUnit timeUnit);

    /**
     * 添加 key 的值，并设置过期时间
     *
     * @param key key
     * @param value value
     * @param timeout 过期时间
     * @param timeUnit 时间单位
     */
    void setEx(String key, Object value, Integer timeout, TimeUnit timeUnit);

    /**
     * 设置 key 的值，如果 key 已经存在，则返回 false
     *
     * @param key key
     * @param value value
     * @return 添加成功与否
     */
    Boolean setNx(Object key, Object value);

    /**
     * 设置 key 的值，如果 key 已经存在，则返回 false
     *
     * @param key key
     * @param value value
     * @return 添加成功与否
     */
    Boolean setNx(String key, Object value);

    /**
     * 设置 key 的值，并设置过期时间，如果 key 已经存在，则返回 false
     *
     * @param key key
     * @param value value
     * @param timeout 过期时间，单位：秒
     * @return 添加成功与否
     */
    Boolean setNx(Object key, Object value, Integer timeout);

    /**
     * 设置 key 的值，并设置过期时间，如果 key 已经存在，则返回 false
     *
     * @param key key
     * @param value value
     * @param timeout 过期时间，单位：秒
     * @return 添加成功与否
     */
    Boolean setNx(String key, Object value, Integer timeout);

    /**
     * 设置 key 的值，并设置过期时间，如果 key 已经存在，则返回 false
     *
     * @param key key
     * @param value value
     * @param timeout 过期时间
     * @param timeUnit 时间单位
     * @return 添加成功与否
     */
    Boolean setNx(Object key, Object value, Integer timeout, TimeUnit timeUnit);

    /**
     * 设置 key 的值，并设置过期时间，如果 key 已经存在，则返回 false
     *
     * @param key key
     * @param value value
     * @param timeout 过期时间
     * @param timeUnit 时间单位
     * @return 添加成功与否
     */
    Boolean setNx(String key, Object value, Integer timeout, TimeUnit timeUnit);

    /**
     * 批量设置 key 的值
     *
     * @param map map
     */
    void multiSet(Map<String, Object> map);

    /**
     * 批量设置 key 的值，如果 key 已经存在，则返回 false
     *
     * @param map map
     * @return 添加成功与否
     */
    Boolean multiSetNx(Map<String, Object> map);

    /**
     * 获取 key 的值
     *
     * @param clazz 泛型的类对象
     * @param key key
     * @return value
     * @param <T> 泛型
     */
    <T> T get(Class<T> clazz, Object key);

    /**
     * 获取 key 的值
     *
     * @param clazz 泛型的类对象
     * @param key key
     * @return value
     * @param <T> 泛型
     */
    <T> T get(Class<T> clazz, String key);

    /**
     * 获取 key 的值
     *
     * @param key key
     * @return value
     */
    Object get(Object key);

    /**
     * 获取 key 的值
     *
     * @param key key
     * @return value
     */
    Object get(String key);

    /**
     * 批量获取 key 的值
     *
     * @param clazz 泛型的类对象
     * @param keys keys
     * @return value
     * @param <T> 泛型
     */
    <T> List<T> multiGet(Class<T> clazz, Object... keys);

    /**
     * 批量获取 key 的值
     *
     * @param keys keys
     * @return value
     */
    List<Object> multiGet(Object... keys);

    /**
     * 追加 key 的值
     *
     * @param key key
     * @param value value 追加的值
     */
    void append(Object key, String value);

    /**
     * 追加 key 的值
     *
     * @param key key
     * @param value value 追加的值
     */
    void append(String key, String value);

    /**
     * 删除 key 所存储的 hash 对象中的多个字段
     *
     * @param key key
     * @param fields fields
     */
    void hashDelete(Object key, Object... fields);

    /**
     * 设置 key 所存储的 hash 对象中的字段值
     *
     * @param key key
     * @param field field
     * @param value value
     */
    void hashPut(Object key, Object field, Object value);

    /**
     * 批量设置 key 所存储的 hash 对象中的字段值
     *
     * @param key key
     * @param map map
     */
    void hashPutAll(Object key, Map<Object, Object> map);

    /**
     * 获取 key 所存储的整个 hash 对象
     *
     * @param key key
     * @return value
     */
    Map<Object, Object> hashEntries(Object key);

    /**
     * 获取 key 所存储的 hash 对象中的所有字段的值
     *
     * @param key key
     * @return value
     */
    List<Object> hashValues(Object key);

    /**
     * 判断 key 所存储的 hash 对象中是否存在 field 字段
     * @param key key
     * @param field field
     * @return 存在与否
     */
    Boolean hashHasKey(Object key, Object field);

    /**
     * 从左入栈
     * @param key key
     * @param value value
     */
    void listLeftPush(Object key, Object value);

    /**
     * 从左入栈
     *
     * @param key key
     * @param value value
     */
    void listLeftPush(String key, Object value);

    /**
     * 从右入栈
     *
     * @param key key
     * @param value value
     */
    void listRightPush(Object key, Object value);

    /**
     * 从右入栈
     *
     * @param key key
     * @param value value
     */
    void listRightPush(String key, Object value);

    /**
     * 从左出栈
     *
     * @param clazz 泛型的类对象
     * @param key key
     * @return value
     * @param <T> 泛型
     */
    <T> T listLeftPop(Class<T> clazz, Object key);

    /**
     * 从左出栈
     *
     * @param clazz 泛型的类对象
     * @param key key
     * @return value
     * @param <T> 泛型
     */
    <T> T listLeftPop(Class<T> clazz, String key);

    /**
     * 从左出栈
     *
     * @param key key
     * @return value
     */
    Object listLeftPop(Object key);

    /**
     * 从左出栈
     *
     * @param key key
     * @return value
     */
    Object listLeftPop(String key);

    /**
     * 从右出栈
     *
     * @param clazz 泛型的类对象
     * @param key key
     * @return value
     * @param <T> 泛型
     */
    <T> T listRightPop(Class<T> clazz, Object key);

    /**
     * 从右出栈
     *
     * @param clazz 泛型的类对象
     * @param key key
     * @return value
     * @param <T> 泛型
     */
    <T> T listRightPop(Class<T> clazz, String key);

    /**
     * 从右出栈
     *
     * @param key key
     * @return value
     */
    Object listRightPop(Object key);

    /**
     * 从右出栈
     *
     * @param key key
     * @return value
     */
    Object listRightPop(String key);

    /**
     * 获取 key 所存储的 list 中指定索引的元素
     *
     * @param clazz 泛型的类对象
     * @param key key
     * @param index 索引
     * @return value
     * @param <T> 泛型
     */
    <T> T listIndex(Class<T> clazz, Object key, int index);

    /**
     * 获取 key 所存储的 list 中指定索引的元素
     *
     * @param clazz 泛型的类对象
     * @param key key
     * @param index 索引
     * @return value
     * @param <T> 泛型
     */
    <T> T listIndex(Class<T> clazz, String key, int index);

    /**
     * 获取 key 所存储的 list 中指定索引的元素
     *
     * @param key key
     * @param index 索引
     * @return value
     */
    Object listIndex(Object key, int index);

    /**
     * 获取 key 所存储的 list 中指定索引的元素
     *
     * @param key key
     * @param index 索引
     * @return value
     */
    Object listIndex(String key, int index);

    /**
     * 获取 key 所存储的 list 的长度
     *
     * @param key key
     * @return value
     */
    Long listSize(Object key);

    /**
     * 获取 key 所存储的 list 的长度
     *
     * @param key key
     * @return value
     */
    Long listSize(String key);

    /**
     * 获取 key 所存储的 list 指定范围的元素
     *
     * @param key key
     * @param start 起始索引
     * @param end 结束索引
     * @return value
     */
    List<Object> listRange(Object key, int start, int end);

    /**
     * 获取 key 所存储的 list 指定范围的元素
     *
     * @param key key
     * @param start 起始索引
     * @param end 结束索引
     * @return value
     */
    List<Object> listRange(String key, int start, int end);

    /**
     * 添加 key 所存储的 set 集合中的元素
     *
     * @param key key
     * @param value value
     */
    void setAdd(Object key, Object value);

    /**
     * 添加 key 所存储的 set 集合中的元素
     *
     * @param key key
     * @param value value
     */
    void setAdd(String key, Object value);

    /**
     * 弹出 key 所存储的 set 集合中的第一个元素
     *
     * @param clazz 泛型的类对象
     * @param key key
     * @return value
     * @param <T> 泛型
     */
    <T> T setPop(Class<T> clazz, Object key);

    /**
     * 弹出 key 所存储的 set 集合中的第一个元素
     *
     * @param clazz 泛型的类对象
     * @param key key
     * @return value
     * @param <T> 泛型
     */
    <T> T setPop(Class<T> clazz, String key);

    /**
     * 弹出 key 所存储的 set 集合中的第一个元素
     *
     * @param key key
     * @return value
     */
    Object setPop(Object key);

    /**
     * 弹出 key 所存储的 set 集合中的第一个元素
     *
     * @param key key
     * @return value
     */
    Object setPop(String key);

    /**
     * 获取 key 所存储的 set 集合中的所有元素
     *
     * @param key key
     * @return value
     */
    Set<Object> setMembers(Object key);

    /**
     * 获取 key 所存储的 set 集合中的所有元素
     *
     * @param key key
     * @return value
     */
    Set<Object> setMembers(String key);

    /**
     * 获取 key 所存储的 set 集合的长度
     * @param key key
     * @return value
     */
    Long setSize(Object key);

    /**
     * 获取 key 所存储的 set 集合的长度
     *
     * @param key key
     * @return value
     */
    Long setSize(String key);
}
